【换根DP】洛谷 P2986 [USACO10MAR] Great Cow Gathering G
2022-03-28 11:50:00
# ACM
题链
https://www.luogu.com.cn/problem/P2986
题解
换根dp一般分为三个步骤
1、先指定一个根节点
2、一次dfs统计子树内的节点对当前节点的贡献
3、一次dfs统计父亲节点对当前节点的贡献并合并统计最终答案
- 第一次 dfs,以 1 为根,求出每棵子树的奶牛总数,以及以 1 为聚集点的 ans[1]
- 设 ans[u] 为以 u 为聚集点的 答案
- 设 g[v] 为 v 的子树下所有奶牛 聚集到 v 的代价
- 设 cost 为 u 到孩子节点 v 的代价
- 现在已知 ans[u],如何求 ans[v] ?
- ans[v] = g[v] + ( ans[u] - (g[v] + cnt[v]*cost) ) + (cnt[1] - cnt[v]) * cost;
- 其中 把 等式右边 分为三个部分
- 第一个部分:g[v] 为 v 的子树下所有奶牛 聚集到 v 的代价,肯定要加上
- 第二个部分:ans[u] - (g[v] + cnt[v]*cost)
- 其中 g[v] + cnt[v]*cost 为 v 的子树下(包括 v) 所有奶牛到 u 的代价
- ans[u] - (g[v] + cnt[v]*cost) 的话就是减去 v 的子树(包括 v) 的代价
- 第一个部分 加 第二个部分 还差 除了 v 子树以外的其他奶牛到 v 的代价,就是第三个部分的代价
- 第三个部分:(cnt[1] - cnt[v]) * cost
- 其中 (cnt[1] - cnt[v]) 表示 除了 v 子树以外的奶牛的个数
于是转移方程也写好了
代码
1 |
|